package com.cskaoyan.mall.fliter;

import com.google.gson.Gson;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter("/api/mall/*")
public class MallFilter implements Filter {
    Gson gson = new Gson();

    public void init(FilterConfig filterConfig) throws ServletException {
        //System.out.println("init");
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        request.setCharacterEncoding("utf-8");
        //System.out.println("doFilter");
        response.setContentType("text/html;charset=utf-8");
        //涉及到跨域，页面8085 访问 8084 ，是不安全的，屏蔽这种行为
        //如果想允许，那么可以让服务端主动授权
        //实际上请求过程：每一个请求发送前，都会先发送一个options请求，试探性请求，如果服务器允许，那么接下来才会发送真正的请求
        //System.out.println("doFilter");
        //将*改为页面系统所在的域
        response.setHeader("Access-Control-Allow-Origin","http://localhost:8085");//目前的浏览器为了数据的安全，所有请求被严格限制在同一域名下，如果需要从不同的服务器(不同域名)上获取数据，那么需要使用跨域HTTP请求。
        response.setHeader("Access-Control-Allow-Methods","POST,GET,OPTIONS,PUT,DELETE");
        response.setHeader("Access-Control-Allow-Headers","x-requested-with,Authorization,Content-Type");
        response.setHeader("Access-Control-Allow-Credentials","true");
        String requestURI = request.getRequestURI();
        System.out.println("MallFilter:"+request.getMethod() + ":" + requestURI +","+ request.getSession().getId());
        //1.需要拦截哪些，哪些不需要拦截
        //2.针对需要拦截的，判断有无Session数据
        //3.如果没有，则拦截
//        if(!request.getMethod().equals("OPTIONS")){ //Options 测试方法不拦截
//            if(auth(requestURI)){
//                Admin admin = (Admin) request.getSession().getAttribute("admin");
//                if (admin == null){
//                    response.getWriter().println(gson.toJson(Result.error("当前接口仅登陆后可以访问")));
//                    return;
//                }
//            }
//        }
        filterChain.doFilter(request, response);
    }

    private boolean auth(String requestURI) {
        //auth --->权限，此方法表示是否需要权限。
        //登录和退出是不需要权限的。如果没有登录后台管理系统，权限一直为true，
        //就算同过连接访问也访问不到，被Filter 拦截
        if("/api/admin/admin/login".equals(requestURI) ||
                "/api/admin/admin/logoutAdmin".equals(requestURI)
        ){
            return false;
        }
        return true;
    }

    public void destroy() {

    }
}
